# -*- coding:utf-8 -*-
import os
from io import BytesIO
from sys import platform

import pybase64
import qrcode
from PIL import Image


def getSeparator():
    if 'Windows' in platform.system():
        separator = '\\'
    else:
        separator = '/'
    return separator


def findPath(file):
    o_path = os.getcwd()
    separator = getSeparator()
    str = o_path
    str = str.split(separator)
    while len(str) > 0:
        spath = separator.join(str) + separator + file
        leng = len(str)
        if os.path.exists(spath):
            return spath
        str.remove(str[leng - 1])


class QRCodeUtil(object):

    # 方法1
    @staticmethod
    def qr_code_1():
        # 调用qrCode的make()方法传入url或者想要展示的内容
        img = qrcode.make('https://blog.csdn.net/RainSky2011')
        # 保存
        img.save("./img/text1.png")
        # 或者
        with open('./img/test2.png', 'wb') as f:
            img.save(f)

    # 方法2
    @staticmethod
    def qr_code_2():
        """
        参数 version 表示生成二维码的尺寸大小，取值范围是 1 至 40，最小尺寸 1 会生成 21 * 21 的二维码矩阵，
        version 每增加 1，生成的二维码就会添加 4 个单位大小，例如 version 是 2，则生成 25 * 25 尺寸大小的二维码。

        参数 error_correction 指定二维码的容错系数，分别有以下4个系数：
        ERROR_CORRECT_L: 7%的字码可被容错
        ERROR_CORRECT_M: 15%的字码可被容错
        ERROR_CORRECT_Q: 25%的字码可被容错
        ERROR_CORRECT_H: 30%的字码可被容错

        参数 box_size 表示二维码里每个格子的像素大小。
        参数 border 表示边框的格子宽度是多少（默认是4）
        """
        # 实例化QRCode生成qr对象
        qr = qrcode.QRCode(
            version=2,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=10,
            border=1
        )
        # 调用qrCode的make()方法传入url或者想要展示的内容
        qr.add_data("python前行者公众号")
        qr.make(fit=True)  # 填充数据
        img = qr.make_image()  # 生成图片
        img.save("E:/Python/test3.png")

    # 方法3  生成带有图标的二维码
    @staticmethod
    def qr_code_3():
        # 实例化QRCode生成qr对象
        qr = qrcode.QRCode(
            version=2,
            error_correction=qrcode.constants.ERROR_CORRECT_H,
            box_size=10,
            border=1
        )
        qr.add_data("https://blog.csdn.net/RainSky2011")  # 添加数据
        qr.make(fit=True)  # 填充数据
        # 生成图片
        # img = qr.make_image()
        img = qr.make_image(fill_color="green", back_color="white")
        img = img.convert("RGBA")  # RGB三原色 + Alpha 透明原色
        # 添加logo，打开logo照片
        icon = Image.open("E:/Python/sarah_muenz__winter_wonderland__4k.jpg").convert("RGBA")
        # 获取图片的宽和搞
        img_w, img_h = img.size
        # 参数设置logo的大小
        factor = 3
        size_w = int(img_w / factor)
        size_h = int(img_h / factor)
        icon_w, icon_h = icon.size
        if icon_w > size_w:
            icon_w = size_w
        if icon_h > size_h:
            icon_h = size_h
        # 重新设置logo的尺寸
        icon = icon.resize((icon_w, icon_h), Image.ANTIALIAS)
        # 得到画图的x，y坐标，居中显示
        w = int((img_w - icon_w) / 2)
        h = int((img_h - icon_h) / 2)
        '''
        img.paste(path,where,mask=None)
        其中，img为image对象；path为所添加图片；where为tuple,如：(x,y)，表示图片所在二维码的横纵坐标
        '''
        # 黏贴logo照
        img.paste(icon, (w, h), icon)
        img.save("E:/Python/CSDN_QRCODE.png")
        # 转成base64
        output_buffer = BytesIO()
        img.save(output_buffer, format='png')
        byte_data = output_buffer.getvalue()
        base64_data = pybase64.b64encode(byte_data)
        # img.show()# 自动打开图片
        # 终端显示图片
        # plt.imshow(img)
        # plt.show()

        # 获取当前项目根目录
        curPath = os.path.abspath(os.path.dirname(__file__))
        rootPath = curPath[:curPath.find("tornado-test\\") + len("tornado-test\\")]  # 获取myProject，也就是项目的根路径
        # dataPath = os.path.abspath(rootPath + 'data\\train.csv')  # 获取tran.csv文件的路径
        print(rootPath)
        return base64_data

    # if __name__ == '__main__':
    #     qr_code_2()
